package com.android.mail;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Email extends javax.mail.Authenticator{
	
	private String mailhost = "smtp.gmail.com";
	private String user;
	private String pw;
	private Session session;
	
	public Email(String user, String pw) {
		// TODO Auto-generated constructor stub
		this.user = user;
		this.pw = pw;
		
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "smtp");
		props.setProperty("mail.host", mailhost);
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.port", "465");
		props.put("mail.smtp.socketFactory.port", "465");
		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.setProperty("mail.smtp.quitwait", "false");
		
		session = Session.getDefaultInstance(props, this);
	}
	
	protected PasswordAuthentication getPasswordAuthentication(){
		return new PasswordAuthentication(user, pw);
	}
	
	public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception{
		MimeMessage message = new MimeMessage(session);
		DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
		message.setSender(new InternetAddress(sender));
		message.setSubject(subject);
		message.setDataHandler(handler);
		if(recipients.indexOf(',') > 0 ) 
			message.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(recipients));
		else
			message.setRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(recipients));
		Transport.send(message);
	}
	
	public class ByteArrayDataSource implements DataSource {
		private byte[] data;
		private String type;
		
		public ByteArrayDataSource(byte [] data, String type){
			this.data = data;
			this.type = type;
		}
		
		public ByteArrayDataSource(byte[]data){
			super();
			this.data = data;
		}
		
		public void setType(String type){
			this.type = type;
		}

		
		public String getContentType() {
			// TODO Auto-generated method stub
			if(type == null){
				return "application/octet-stream";
			}else
			return type;
		}

		
		public InputStream getInputStream() throws IOException {
			// TODO Auto-generated method stub
			return new ByteArrayInputStream(data);
		}

		
		public String getName() {
			// TODO Auto-generated method stub
			return "ByteArrayDataSource";
		}

		
		public OutputStream getOutputStream() throws IOException {
			// TODO Auto-generated method stub
			throw new IOException("Not Supported");
		}
		
		
	}

}
